package cn.tedu.v5;

import java.io.*;
import java.net.*;
import java.util.*;

public class Client {
    private Socket socket;
    private static final String HOST = "192.168.58.191";
    private static final Integer PORT = 2345;
    private PrintWriter pw;
    private BufferedReader br;

    public Client() {
        try {
            socket = new Socket(HOST, PORT);
            br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
            pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8")), true);
        } catch (NullPointerException e) {
            System.out.println("友情提示：IP传入错误导致链接失败~");
        } catch (UnknownHostException e) {
            System.out.println("友情提示：IP传入错误");
        } catch (ConnectException e) {
            System.out.println("客户端链接失败：建议检查IP或者端口号");
        } catch (IOException e) {
            System.out.println("客户端链接服务器端失败，提示：检查IP/端口");
        }
    }

    public void start() {
        System.out.println("~~~~欢迎使用欣欣牌聊天室~~~~");
        Scanner input = new Scanner(System.in);
        try {
            //1.读入服务器：“请输入用户名：”
            String serverMessage = br.readLine();
            //1.1显示“请输入用户名：”
            System.out.println(serverMessage);
            //1.2用户输入--用户名
            String username = input.nextLine();
            //1.3用户输入的用户名--写出给服务器端
            pw.println(username);
            //2.1读入服务器端发来的“请输入密码：”
            serverMessage = br.readLine();
            System.out.println(serverMessage);
            //2.2用户输入---密码--写出给服务器端
            String password = input.nextLine();
            pw.println(password);
            //3.登录之后【登录成功、登录失败】
            //字符串方法：startWith() 返回值 Boolean 前缀名称一致
            serverMessage = br.readLine();
            if (serverMessage.startsWith("登录成功")) {
                //封装一个客户端：读写流--chat聊天
                //1.显示“登录成功”或“登录失败”
                System.out.println("登录成功，欢迎进入聊天室");
                chat();
            } else {
                serverMessage.startsWith("登录失败");
                System.out.println("登录失败，用户名或者密码错误！");
                socket.close();
            }
        } catch (IOException e) {
            System.out.println("客户端断开连接了！");
        } finally {
            if (br != null)
                try {
                    br.close();
                } catch (IOException e) {
                    System.out.println("客户端关闭失败~");
                }
            if (pw != null)
                pw.close();
            if (socket != null && !socket.isClosed())
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }

    //封装一个针对聊天功能：读写  chat()
    private void chat() {
        new Thread(() -> {
            try {
                String message;
                while ((message = br.readLine()) != null) {
                    //3.Server端退出之后【退出成功、退出失败】
                    if ("exit".equalsIgnoreCase(message)) {
                        System.out.println("欣欣退出聊天室");
                    } else {
                        System.out.println("服务器端说：" + message);
                    }
                    //2.显示“输入exit”
                    System.out.println("服务器端说：请输入消息（输入 exit 退出）");
                    System.out.println("客户端请输入：");
                }
            } catch (IOException e) {
                System.out.println("服务器端读入失败！");
            }
        }).start();
        Scanner input = new Scanner(System.in);
        System.out.println("客户端请输入：");
        while (true) {
            String line = input.nextLine();
            //4.Client端输入“exit”显示“退出聊天”并关闭Client端
            if ("exit".equalsIgnoreCase(line)) {
                System.out.println("退出聊天...拜拜~");
                System.exit(0);
            } else {
                pw.println(line);
            }
        }
    }

    public static void main(String[] args) {
        new Client().start();
    }
}